# 使用Java 17基础镜像
#FROM eclipse-temurin:21-jdk  功能更完善，适合生产
FROM eclipse-temurin:21-jdk-alpine
LABEL authors="fs"

# 设置时区为Asia/Shanghai，可以根据需要更改
ENV TIME_ZONE=Asia/Shanghai

ARG ARTIFACT
ARG VERSION

# 更新时区
RUN ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime && echo $TIME_ZONE > /etc/timezone

# 将当前目录下的jar包复制到docker容器的/目录下
ADD /target/${ARTIFACT}-${VERSION}.jar /opt/${ARTIFACT}.jar

# 设置容器内的工作目录
WORKDIR /opt

#-Xms5324m: 设置 Java 堆的初始值为 5324 MB。
#-Xmx5324m: 设置 Java 堆的最大值为 5324 MB。这指定了 Java 堆可以使用的最大内存量。
#-XX:MaxMetaspaceSize=256m: 设置 Metaspace 区域的最大大小为 256 MB。Metaspace 用于存储类的元数据，而不是传统的永久代。
#-XX:MetaspaceSize=256m: 设置 Metaspace 区域的初始大小为 256 MB。
#-XX:MaxDirectMemorySize=983m: 设置直接内存的最大大小为 983 MB。这是堆外内存，通常由 NIO (New I/O) 使用。
#-Djava.library.path=/usr/local/lib: 指定本地库的搜索路径。
#-server: 启用服务器模式。服务器模式通常用于长时间运行的 Java 应用程序，以优化性能。
#-XX:+HeapDumpOnOutOfMemoryError: 当发生 OutOfMemoryError 时，生成堆转储文件。
#-XX:HeapDumpPath=/dumps/oom_dump.hprof: 指定堆转储文件的路径。堆转储文件将被写入 /dumps/oom_dump.hprof 目录文件中。
#-Djava.awt.headless=true: 表示在无图形环境中运行 Java 应用程序，没有图形用户界面 (GUI)。
#-Dsun.net.client.defaultConnectTimeout=60000: 设置默认的连接超时时间为 60,000 毫秒。
#-Dsun.net.client.defaultReadTimeout=60000: 设置默认的读取超时时间为 60,000 毫秒。
#-Djmagick.systemclassloader=no: 关闭 JMagick 的系统类加载器。
#-Dnetworkaddress.cache.ttl=300: 设置网络地址缓存的 TTL (生存时间) 为 300 秒。
#-Dsun.net.inetaddr.ttl=300: 设置 Inet 地址的 TTL 为 300 秒。
#-XX:+UseZGC: 启用 Z Garbage Collector。ZGC 是一种低延迟的垃圾回收器，适用于大内存应用。
#-Xlog:gc*,gc+heap,gc+age:file=/var/log/gc.log:time,level,tags    全量打印gc日志
#-XX:+PrintGCDetails
#-XX:MaxRAMPercentage=75                jvm的最大内存占容器内存的75%
#-XX:InitialRAMPercentage=75            jvm的初始化内存占容器内存的75%

ENV JAVA_OPTS="-server -XX:MaxRAMPercentage=75 -XX:InitialRAMPercentage=75 -XX:+UseG1GC -Xlog:gc*,gc+heap,gc+age:file=/var/log/gc.log:time,level,tags -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/dumps/oom_dump.hprof"
ENV ARTIFACT=${ARTIFACT}
# 设置容器启动时执行的命令
ENTRYPOINT ["sh", "-c", "exec java ${JAVA_OPTS}  -jar /opt/$ARTIFACT.jar --spring.profiles.active=prod"]

#ENTRYPOINT java \
#           # 应用名称 如果想区分集群节点监控 改成不同的名称即可
#           #-Dskywalking.agent.service_name=ruoyi-server \
#           #-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar \
#           ${JAVA_OPTS} \
#           -jar ds-admin.jar \
#           --spring.profiles.active=prod

